/* 无重复字符的最长字串
    给定一个字符串 s ，请你找出其中不含有重复字符的最长子串的长度。
    示例 1:
    输入: s = "abcabcbb"
    输出: 3
    解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

    示例 2:
    输入: s = "bbbbb"
    输出: 1
    解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

    示例 3:
    输入: s = "pwwkew"
    输出: 3
    解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。

    请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
*/

#include <iostream>
#include <string>
#include <unordered_set>
// unordered_set 是 C++ 标准库中的一种容器，属于哈希集合，它用于存储唯一的元素，并且元素没有特定的顺序。

using namespace std;

int lengthOfLongestSubstring(string s)
{
    unordered_set<char> charSet; // 定义一个无序set容器，用于存储当前窗口中的字符
    int maxLength = 0;           // 记录最长字串的长度
    int left = 0, right = 0;     // 窗口的左右边界

    while (right < s.length())
    {
        // 如果s[right]不在容器中，插入到容器并移动窗口右边界
        if (charSet.find(s[right]) == charSet.end()) // 在容器中查找，找不到返回尾部迭代器
        {
            charSet.insert(s[right]);
            right++;
            maxLength = max(maxLength, right - left); // 更新最大长度
        }
        // 在容器中，删掉s[left]，并移动左边界
        else
        {
            charSet.erase(s[left]);
            left++;
        }
    }

    return maxLength;
}

int main()
{
    string s = "aabbcd";
    cout << "无重复字符的最长字串是：" << lengthOfLongestSubstring(s) << endl;
    
    return 0;
}